import Watcher from "./watcher.js";

export default function initComputed(vm) {
  // 获取配置项
  const computeds = vm.$options.computed || {};
  // 记录 watcher
  const watcher = (vm._watcher = Object.create(null));
  // 挂载到 $vm 上 是他可以通过  this.xxx() 调用
  for (const key in computeds) {
    // 实例化watcher 回调函数默认懒执行
    watcher[key] = new Watcher(computeds[key], { lazy: true }, vm);
    // 将computed属性代理到Vue实例上
    proxyMethdosToVm(vm, key);
  }
}

// 代理计算属性computed到Vm实例上
function proxyMethdosToVm(vm, key) {
  const descriptor = {
    get() {
      // 拿到计算属性
      const watcher = vm._watcher[key];
      if (watcher.dirty) {
        // watcher.dirty 为true 表示在第一次渲染中没有执行缓存
        // 那么就执行它 通知watcher执行 computed回调函数 将回调函数赋值给 watcher.value
        watcher.evalute();
      }

      return watcher.value;
    },
    set() {
      console.log("computed is not setter function");
    },
  };

  Object.defineProperty(vm, key, descriptor);
}
